package com.moses.string;

/**
 * @author Moses
 * @email shenhuohui@gmail.com
 * @date 2021/5/30 0:48
 */
public class Client {
    public static void main(String[] args) {
        String a = "a";
        String b = "b";
        String c = "ab";
        // 通过反编译 javap 查看，编译后，（变量的拼接）会使用StringBuilder来构建对象并使用append方法拼接
        String d = a + b;
        // c在常量池中，而d在堆中（new 了一个StringBuilder对象）
        System.out.println(c == d);  // false
        // 字面量拼接（常量的拼接）在编译期间已被优化，e的结果在常量池中
        String e = "a" + "b";
        System.out.println(c == e); // true
        // f同d一样，放在堆中而且堆会有三个对象，“a”、“b”、“ab”
        String f = new String("a") + new String("b");
        System.out.println(c == f); // false
        // 1.8 intern方法：如果字符串常量池中有，则返回字符串常量池中的对象，没有则放到堆中，并返回堆中对象引用
        // 1.6 intern方法：如果字符串常量池中有，则返回字符串常量池中的对象，没有则复制一份再放到堆中，并返回堆中的对象引用
        System.out.println(c == f.intern()); // true
        System.out.println(c == "ab"); // true
    }
}
